#ifndef SUBWIDGET2_H
#define SUBWIDGET2_H

#include <QWidget>
#include <QSqlDatabase>
#include <QSqlQuery>
#include <QTableWidget>
#include <QDateTimeEdit>
#include <QDebug>
#include <QMessageBox>

#include <QVector>
#include <QtAlgorithms>

// 这里因为相互包含，所以通过这样算是前置声明，这里只能声明，不能实例化对象
class SubWidget1;        //目的是临时借用给SubWidget2一些成员函数来画图用，后续就不能给了

namespace Ui {
class SubWidget2;
}

//将列名弄为枚举，也就相当于宏定义了，但枚举效果比宏定义好些
typedef enum{e_data, e_t_furnace, e_t_wind1, e_t_wind2, e_t_wind3, e_t_tower1,
     e_t_tower2, e_t_tower3, e_v_coal, e_v_grain, e_rh_after_grain, e_rh_before_grain} parameters;

class SubWidget2 : public QWidget
{
    Q_OBJECT

    friend class SubWidget1;          //让1做友元， 后续把这句删掉，不知道让1做友元， 合不合适，后续问一下老师
public:
    //explicit SubWidget2(QWidget *parent = nullptr);
    explicit SubWidget2(QSqlDatabase &db, int col=12, QWidget *parent = nullptr);
    //void setDataBase(QSqlDatabase &db);             //设置当前的数据库指向外部传入的数据库

    //数据库操作
    void moveDataBase_to_table();        //将数据库的数据显示到表中
    QStringList query_by_datatime();   //通过日期查询时间

    //对容器的操作
//    template<class T>
//    void updata_vector(int index, T vector1);
    void updata_vector(int index, const QVector<double>& vector1);

    //画图
    void plot_all_chart();          //所有的图
    void plot_chart(const QVector<int>& v);      //画温度图、转速图等使用 传入的v是一个存储要画图的容器的索引
    ~SubWidget2();
private:
    //初始化的函数
    void tableInit(int row, int col=13);  //初始化表
    void dateTimeButtonInit();

    //处理容器的函数
    QVector<double>& getSequence(int i);
    void push_to_vector(int d, double data);  //将数据传入到第d个容器内，用于后续可视化用
    void clear_vector();    //格式化所有容器，在每次查询后，都进行一次格式化，方便用新得数据绘图
    template<class T>   //T为我们想要打印容器的类型
    void print_vector_for_test(const QVector<T>& vector1, int max=0);       //测试用，用来打印容器，看一下容器内容有没有问题

    //数据库操作
    //void search_by_query(const QSqlQuery& query); //这里不能将query以常成员的形式传入，因为常成员函数不能调用普通的成员函数，即query无法调用.next()函数
    void search_by_query(QSqlQuery& query); //通过传入的query进行语句查询

private:
    Ui::SubWidget2 *ui;
    QSqlDatabase m_db;

    int m_row;      //设置表格行数
    int m_col;      //设置表格列数

    //初始化容器
    QVector<double> m_v_date;  //这个日期类型的数据，只能暂时用一个QString的容器存一下试试了，但是这样就导致成员函数void push_to_vector(int d, int data)得特殊处理他
    QVector<double> m_v_t_furnace;
    QVector<double> m_v_t_wind1;
    QVector<double> m_v_t_wind2;
    QVector<double> m_v_t_wind3;
    QVector<double> m_v_t_tower1;
    QVector<double> m_v_t_tower2;
    QVector<double> m_v_t_tower3;
    QVector<double> m_v_v_coal;
    QVector<double> m_v_v_grain;
    QVector<double> m_v_rh_after_grain;
    QVector<double> m_v_rh_before_grain;
    //表格标签属性初始化，plot和plot_all_chart函数用
    QStringList m_lineNames;

signals:
    void sql_by_dataTime(QStringList data);

protected:
    void closeEvent(QCloseEvent *event);
    };

#endif // SUBWIDGET2_H
